package service

import (
	"github.com/casbin/casbin/v2"
	"github.com/go-redis/redis/v8"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

var (
	Conf *Config
	G    *gorm.DB
	R    *redis.Client
	Zap  *zap.Logger
	E    *casbin.Enforcer
)

type Config struct {
	System System `mapstructure:"system" json:"system" yaml:"system"`
	Mysql  Mysql  `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
	Redis  Redis  `mapstructure:"redis" json:"redis" yaml:"redis"`
	Zaps   Zaps   `mapstructure:"zap" json:"zap" yaml:"zap"`
	Sms    Sms    `mapstructure:"sms" json:"sms" yaml:"sms"`
}

// 运行配置
type System struct {
	Env    string   `mapstructure:"env" json:"env" yaml:"env"`          // 环境值
	Addr   int      `mapstructure:"addr" json:"addr" yaml:"addr"`       // 端口值
	WsAddr string   `mapstructure:"wsaddr" json:"wsaddr" yaml:"wsaddr"` // ws端口值
	WebUrl []string `mapstructure:"weburl" json:"weburl" yaml:"weburl"` // 跨域校验
}

//数据库
type Mysql struct {
	Path         string `mapstructure:"path" json:"path" yaml:"path"`                             // 服务器地址:端口
	Config       string `mapstructure:"config" json:"config" yaml:"config"`                       // 高级配置
	Dbname       string `mapstructure:"db-name" json:"dbname" yaml:"db-name"`                     // 数据库名
	Username     string `mapstructure:"username" json:"username" yaml:"username"`                 // 数据库用户名
	Password     string `mapstructure:"password" json:"password" yaml:"password"`                 // 数据库密码
	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"maxIdleConns" yaml:"max-idle-conns"` // 空闲中的最大连接数
	MaxOpenConns int    `mapstructure:"max-open-conns" json:"maxOpenConns" yaml:"max-open-conns"` // 打开到数据库的最大连接数
	LogMode      int    `mapstructure:"log-mode" json:"logMode" yaml:"log-mode"`                  // 是否开启Gorm全局日志
	LogZap       bool   `mapstructure:"log-zap" json:"logZap" yaml:"log-zap"`                     // 是否通过zap写入日志文件
}

type Redis struct {
	DB       int    `mapstructure:"db" json:"db" yaml:"db"`                   // redis的哪个数据库
	Addr     string `mapstructure:"addr" json:"addr" yaml:"addr"`             // 服务器地址:端口
	Password string `mapstructure:"password" json:"password" yaml:"password"` // 密码
}

type Zaps struct {
	Level    string `mapstructure:"level" json:"level" yaml:"level"`          // 日志等级
	Filename string `mapstructure:"filename" json:"filename" yaml:"filename"` // 日志文件名称
	MaxSize  int    `mapstructure:"maxsize" json:"maxsize" yaml:"maxsize"`    // 文件大小
	Backubs  int    `mapstructure:"backubs" json:"backubs" yaml:"backubs"`    // 备份数量
	Maxage   int    `mapstructure:"maxage" json:"maxage" yaml:"maxage"`       // 备份天数
	Compress bool   `mapstructure:"compress" json:"compress" yaml:"compress"` // 是否压
}

//验证码
type Sms struct {
	Type     string `mapstructure:"Type" json:"Type" yaml:"Type"`
	AppKey   string `mapstructure:"AppKey" json:"AppKey" yaml:"AppKey"`
	RegTplId string `mapstructure:"RegTplId" json:"RegTplId" yaml:"RegTplId"`
	CorpID   string `mapstructure:"CorpID" json:"CorpID" yaml:"CorpID"`
	Pwd      string `mapstructure:"Pwd" json:"Pwd" yaml:"Pwd"`
}
